/* The Jump Search algorithm allows to combine a linear search with a speed optimization.
  * This means that instead of going 1 by 1, we will increase the step of √n and increase that 
  * step of √n which make the step getting bigger and bigger.
  * The asymptotic analysis of Jump Search is o(√n). Like the binary search, it needs to be sorted.
  * The advantage against binary search is that Jump Search traversed back only once.
 */

const jumpSearch = (arr, value) => {
    const length = arr.length;
    let step = Math.floor(Math.sqrt(length));
    let lowerBound = 0;
    while (arr[Math.min(step, length) - 1] < value) {
        lowerBound = step;
        step += step;
        if (lowerBound >= length) {
            return -1;
        }
    }

    const upperBound = Math.min(step, length);
    while (arr[lowerBound] < value) {
        lowerBound++;
        if (lowerBound === upperBound) {
            return -1;
        }
    }
    if (arr[lowerBound] === value) {
        return lowerBound;
    }
    return -1;
}
const arr = [0,0,4,7,10,23,34,40,55,68,77,90]
jumpSearch(arr,4);
jumpSearch(arr,34);
jumpSearch(arr,77);
